package main

import (
	"fmt"
	"time"
)

func main() {
	ch1, ch2 := make(chan int), make(chan int)
	go func() {
		time.Sleep(time.Second * 5)
		ch1 <- 5
		// 从一个已经关闭的 channel 接收数据永远不会被堵塞
		close(ch1)
	}()
	go func() {
		time.Sleep(7 * time.Second)
		ch2 <- 7
		close(ch2)

	}()

	//var ok1, ok2 bool
	for {
		select {
		// 如果通道关闭，将会得到对应的零值
		case x, ok := <- ch1:
			if !ok {
				ch1 = nil
			} else {
				fmt.Println(x)

			}
			//ok1 = true
			// 如果 channel 关闭 ，则永远不会走该分支
		case x, ok := <- ch2:
			if !ok {
				// 对于一个 nil channel 执行取值，会堵塞
				ch2 = nil
			} else {
				fmt.Println(x)

			}

		}
		if ch1 == nil && ch2 == nil {
			break
		}
	}
	fmt.Println("program end")
}
